symphora Phase 2 · prototype
Projects · Cost & margin

Multi-currency: FX & reporting rollup

Pay in one currency, bill in another, and still see trustworthy cost & margin rolled up into a single reporting currency — with every converted figure auditable to its rate and date. A number that looks authoritative but is ambiguously converted is worse than no number.

₨3,451,160$12,395
Every money figure has two identities. Its native value — what was actually paid or billed — and its reporting value, converted for summing. The whole design makes that duality legible without cluttering the 95% of views that are single-currency.
The system · design this first
FX disclosure system
The reusable “this number was converted” marker — vocabulary legend, three treatments to choose from, and the four states every converted figure resolves to (native · fresh · stale · no-rate).
CenterpieceGlyph · chip · underlineHover detailRounding footnote
Where it's wired
1
Cost dashboard
Hero tiles, mixed-currency burn rows, converted trends, and the Reporting↔Native toggle. Flip to the single-currency “clean” view to see zero added chrome.
Reporting / nativeMissing-rate gapProgressive disclosure
2
Ticket cost tab
The most zoomed-in view of the duality: hours costed in payroll PKR, billed in contract USD, margin in reporting USD. Actual/flat × native/reporting are orthogonal.
Margin bandPer-person rates
3
FX rate management
The rates behind every conversion. Pair · rate · as-of · source, with manual entry, a future feed indicator, the org freshness threshold, and empty / stale states.
Dedicated pageEmpty · populated · stale
4
Org settings · Reporting currency
A relabel of the existing org currency field — “Reporting currency”, “All dashboards roll up into this” — plus the entry point to FX rates. IA change, not a new screen.
Copy / IA
5
Project budget · “Billed in”
Clarify the transaction-currency field with a note on how it converts for portfolio rollups, plus a live rollup preview. Same picker, clearer label.
Copy / IARollup preview
Open decisions · resolved
Default dashboard view?
Reporting currency, native revealed on hover / toggle.
One global rate per pair per day, or per-transaction locked rate?
Per-transaction, locked at booking. Actuals never drift; only forecasts use the latest rate (and can go stale).
Stale signal — global banner or per-figure?
Per-figure marker. The ≈ turns warn and the popover says how many days old.
Stale threshold — fixed or configurable?
Org-configurable (default 7 days), set in FX settings.
Rate management — page or modal?
Dedicated page — room for history, threshold, and rounding policy.
Rounding / reconciliation?
Convert-then-sum (rows stay auditable) with a quiet ±rounding footnote where totals can drift.
Reuses Symphora tokens, the source-caption pattern, margin bands & the scale bar. Out of scope: rate-pair math, feed automation, historical backfill — and Phase 0/1 (symbol fix, currency-per-amount) need no new design.